package dao;
import metier.*;

import java.util.*;

import java.sql.*;
/**
 * Classe d'impl�mentation de l'interface IDaoCollaborateur
 * pour rendre les collaborateurs persistants dans une table de BD MySql
 * 
 */
public class DaoCollaborateurMySql implements IDao <Collaborateur>{
	private Connection maCnx;
	/**
	 * Constructeur de la classe DaoCollaborateurMySql
	 * Charge le pilote JDBC pour MySql et �tablit la connexion
	 * avec le serveur de donn�es local (base tempofixe)
	 */
	public DaoCollaborateurMySql()  {
		maCnx = null;
		try {
			   
			   Class.forName("com.mysql.jdbc.Driver") ;
			   System.out.println("Pilote JDBC pour MySql charg�");

			   maCnx = DriverManager.getConnection("jdbc:mysql://localhost/tempofixe", "root", "");
			   System.out.println("Etablissement connexion vers le serveur de donn�es MySql r�ussie");
		}
		catch (ClassNotFoundException e) {
			System.err.println("Erreur chargement pilote JDBC pour MySql : "+ e.getMessage());
		}
		catch (SQLException e) {
			System.err.println("Erreur ouverture connexion vers le serveur MySql : " + e.getMessage());
		}

	}
	/**
	 * fermeture de la connexion
	 */
	public void finalize(){
		if ( maCnx != null ) {
			try {
				maCnx.close();
				System.out.println("Fermeture bdd...");
			}
			catch (SQLException e){
				System.err.println("Erreur fermeture connexion");
			}
		}
		System.out.println("Destructeur appel�");
		maCnx = null;
	}

/**
 * Fournit la liste de tous les Collaborateurs.
 * @return	ArrayList<Collaborateur>
 * @see DaoCollaborateurMySql
*/
	public ArrayList<Collaborateur> getAll() {
		ArrayList<Collaborateur> maListe = new ArrayList<Collaborateur>();
		if (maCnx != null ) {
			try {
			   Statement st = maCnx.createStatement();
			   String req = "select * from Collaborateur order by matricule";
			   
			   ResultSet rs = st.executeQuery(req);			    
			   boolean ligneLue = rs.next();
			   while ( ligneLue ) {  

				   	Collaborateur unCollaborateur;
				    unCollaborateur=getCollaborateur(rs);					
					maListe.add(unCollaborateur);
					ligneLue = rs.next();	 
			   }
			   rs.close();	 
			}
			catch (SQLException e) {
				System.err.println("Erreur r�cup�ration des Collaborateurs");
			}

		}
		return maListe;
	}

	
	public Integer getLastCollab() {
		int lastMatricule = 1;
		if (maCnx != null ) {
			try {
			   Statement st = maCnx.createStatement();
			   String req = "select max(matricule) as matriculeMax from Collaborateur";
			   
			   ResultSet rs = st.executeQuery(req);
			   rs.next();
			   lastMatricule = rs.getInt("matriculeMax");
			   rs.close();	
			}
			catch (SQLException e) {
				System.err.println("Erreur récupération du matricule max");
			}

		}
		return lastMatricule;
	}
/**
 * Fournit un Collaborateur-vous d'apr�s son id.
 * @param	unId un identifiant
 * @return	Collaborateur		le Collaborateur
 * @see DaoCollaborateurMySql
 * @
*/
	public Collaborateur getOne(int unMatricule) {
		Collaborateur unCollaborateur = null;
		if (maCnx != null ) {
		try {
			   Statement st = maCnx.createStatement();
			   String req = "select * from collaborateur where matricule =" + unMatricule + ";";
			   ResultSet rs = st.executeQuery(req);
			   boolean ligneLue = rs.next();
			   if (ligneLue){
				   unCollaborateur=getCollaborateur(rs);
			   }
		}
		catch (SQLException e) {
			System.err.println("Erreur r�cup�ration du collaborateur");
		}
		}
		return unCollaborateur;
	}

	/**
	 * Cr�e le Collaborateur unCollaborateur dans la base de donn�es.
	 * Le Collaborateur cr�� est retourn�.
	 * @param	unCollaborateur	le Collaborateur � cr�er
	 * @return	Collaborateur		le Collaborateur cr��
	 * @see DaoCollaborateurMySql
	*/
	public Collaborateur create(Collaborateur unCollaborateur) {
		try {
			   Statement st = maCnx.createStatement();
			   String req = "insert into collaborateur " ;
			   req += "(matricule,nom,prenom) ";
			   req += "values (" + unCollaborateur.getMatricule() + ",";
			   req += "'" + unCollaborateur.getNom() + "',";
			   req += "'" + unCollaborateur.getPrenom() + "'";			   
			   req += ")";
			   st.executeUpdate(req);

		}
		catch(SQLException e){
			System.err.println("Erreur cr�ation du collaborateur");
		}
		return unCollaborateur;
	}

	/**
	 * Met � jour du Collaborateur unCollaborateur dans la base.
	 * Le Collaborateur modifi� est retourn�.
	 * @param	unCollaborateur	le Collaborateur � modifier
	 * @return	Collaborateur		le Collaborateur modifi�
	 * @see DaoCollaborateurMySql
	*/
	public Collaborateur update(Collaborateur unCollaborateur) {
		try {
			   Statement st = maCnx.createStatement();
			   String req = "update  collaborateur " ;
			   req += "set nom = '" + unCollaborateur.getNom() + "',";
			   req += " prenom = '" + unCollaborateur.getPrenom() + "'";			  
			   req += " where matricule = " + unCollaborateur.getMatricule() ;			   
			   st.executeUpdate(req);

		}
		catch(SQLException e){
			System.err.println("Erreur modification du collaborateur");
		}
		return unCollaborateur;
	}

	/**
	 * Supprime le Collaborateur unCollaborateur dans la table Collaborateur
	 * @param	unCollaborateur	l Collaborateur � supprimer
	 * @see DaoCollaborateurMySql
	*/
	public void delete(Collaborateur unCollaborateur) {
		try {
		   Statement st = maCnx.createStatement();
		   int unMatricule = unCollaborateur.getMatricule();
		   String req = "delete from Collaborateur where matricule = " + unMatricule;		  
		   st.executeUpdate(req);
		}
		catch ( SQLException e){
			System.err.println("Erreur ex�cution demande de suppression d'un Collaborateur");
		}
	}
	
	/**
	 * retourne le collaborateur instancie � partir d'un ligne d'un recordset
	 * @param rs
	 * @return
	 * @throws SQLException
	 */
	private Collaborateur getCollaborateur(ResultSet rs) throws SQLException{
		Collaborateur unCollaborateur;
		int unMatricule;
		String unNom, unPrenom;

		unMatricule = rs.getInt("matricule");
		unNom = rs.getString("nom");
		unPrenom = rs.getString("prenom");					
	   
	   	unCollaborateur = new Collaborateur(unMatricule, unNom, unPrenom);    
		return unCollaborateur;
		
	}
	
}
